package des.wangku.operate.standard.task;

import java.io.InputStream;
import java.net.URL;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import des.wangku.operate.standard.Pv;
import des.wangku.operate.standard.desktop.DesktopUtils;
import des.wangku.operate.standard.desktop.TaskObjectClass;
import des.wangku.operate.standard.swtComposite.SWTSearch;
import des.wangku.operate.standard.utls.UtilsFile;
import des.wangku.operate.standard.utls.UtilsJar;
import des.wangku.operate.standard.utls.UtilsString;

/**
 * 主任务基础结构抽像类
 * @author Sunjian
 * @version 1.0
 * @since jdk1.8
 */
public abstract class AbstractTask1_Basic extends AbstractTask0_Original implements InterfaceAbstractTaskBaseSourceFileExt {

	/** 项目的扩展对象，用于伴随 */
	TaskObjectClass baseTaskTOC = null;

	/** 父容器 */
	public Composite parentComposite;

	/** 父视图 */
	public Display parentDisplay = null;

	/** 父Shell */
	public Shell parentShell = null;

	/**
	 * 空的构造函数。如果调用此构造函数，则不初始化内部方法，只生成本Bean<br>
	 * 用于抽出项目class中的信息。无其它功能<br>
	 * 含 Composite 一个参数的构造函数必须存在，平台检索时需要此函数<br>
	 * @param parent Composite
	 */
	public AbstractTask1_Basic(Composite parent) {
		super(parent, SWT.NONE);
		initialization(parent, SWT.NONE);
	}

	public AbstractTask1_Basic(Composite parent, int style) {
		super(parent, style);
		initialization(parent, style);
	}

	/**
	 * 启动后进行操作
	 */
	void startup_Load() {
		/* 更改任务菜单的状态 */
		List<MenuItem> list = baseTaskTOC.getTaskMenuItemAll();
		MenuItem[] arrs = SWTSearch.menuSearch(baseTaskTOC.getMenu(), baseTaskTOC.getId());
		for (MenuItem g : list) {
			if (!g.isEnabled()) continue;
			for (MenuItem f : arrs) {
				if (g.equals(f)) {
					g.setEnabled(false);
				}
			}
		}
		super.startup_Load();
	}

	/**
	 * 销毁时启动
	 */
	void disposeTask() {
		if (baseTaskTOC == null) return;
		int id = baseTaskTOC.getId();
		boolean isexist = DesktopUtils.isExist(id);
		if (!isexist) return;
		List<MenuItem> list = baseTaskTOC.getTaskMenuItemAll();
		for (MenuItem g : list) {
			if (g.getID() == id) g.setEnabled(true);
		}
		super.disposeTask();
	}

	/**
	 * 得到实际子项目的Class
	 * @return Class&lt;?&gt;
	 */
	protected abstract Class<?> getBasicClass();

	/**
	 * 得到与model目录下的具体项目里的资源文件 如"d:/XXXXX/model/px/"<br>
	 * 用于后期把资源放在model目录中的Px目录下，用项目编号进行分目录保存，后期使用
	 * @param filename String
	 * @return String
	 */
	@Deprecated
	public final String getCatalogModel_Ext() {
		String id = getTask_IdentifierLCase();
		if (id.length() == 0) return DesktopUtils.getJarBasicPathmodel() + "/";
		return DesktopUtils.getJarBasicPathmodel() + "/" + id + "/";
	}

	/**
	 * 得到d:/XXX/XXX/model/des-wkope-task-p101_{ext}.{filExt}
	 * @param ext String
	 * @param fileExt String
	 * @return String
	 */
	public final String getCatalogModel_FilePath(String fileExt) {
		return getCatalogModel_Path() + "/" + getProject_SameNameFile(fileExt);
	}

	@Override
	public final String getCatalogModel_FilePath(String ext, String fileExt) {
		return getCatalogModel_Path() + "/" + getProject_SameNameFile(ext, fileExt);
	}

	/**
	 * 返回 model目录的路径<br/>
	 * D:/Eclipse/eclipse-oxygen/Workspaces/des-wkope/build/libs/model
	 * @return String
	 */
	public final String getCatalogModel_Path() {
		return DesktopUtils.getJarBasicPathmodel();
	}

	/**
	 * 得到项目输出绝对路径<br>
	 * D:/Eclipse/eclipse-oxygen/Workspaces/des-wkope/build/libs/output/p10
	 * @return String
	 */
	public String getCatalogOutput_Path() {
		String id = getTask_IdentifierLCase();
		id = (id == null || id.length() == 0) ? "" : "/" + id;
		return Pv.getOutpoutCatalog() + id;
	}

	/**
	 * 得到本地jar包中resources目录里的文件<br/>
	 * "/contraband/Prohibitedadvertisingwords.txt"
	 * @param file String
	 * @return URL
	 */
	protected final URL getJar_File(String file) {
		Class<?> classz = getBasicClass();
		if (classz == null) return null;
		try {
			return UtilsJar.getJarSourceURL(classz, file);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		return null;

	}

	/**
	 * 得到本地jar包中resources目录里的文件
	 * @param file String
	 * @return String
	 */
	protected final String getJar_FileContent(String file) {
		try {
			URL url = getJar_File(file);/* "/update.info" */
			if (url == null) return null;
			InputStream is = url.openStream();
			String content = UtilsFile.readFile(is).toString();
			return content;
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		return null;
	}

	/**
	 * 得到完整项目名称 [P02]XXXXXXXXXXXX<br>
	 * 为null，则不允许加载
	 * @return String
	 */
	public String getMenuText() {
		String name = getTask_NameAll();
		String id = getTask_IdentifierLCase();
		if (id != null && id.length() > 0) name = "[" + id + "]" + name;
		return name;
	}

	/**
	 * 得到des-wkope-task-p001 [p001]小写
	 * @return String
	 */
	public final String getProject_Name() {
		return ACC_PROHead + getTask_IdentifierLCase();
	}

	/**
	 * 得到此项目相关不同文件 des-wkope-task-p001.XXX
	 * @param fileExt String
	 * @return String
	 */
	public final String getProject_SameNameFile(String fileExt) {
		if (fileExt == null) return getProject_Name();
		return getProject_Name() + "." + fileExt;
	}

	/**
	 * 得到此项目相关不同文件 des-wkope-task-p001_{ext}.{fileExt}
	 * @param ext String
	 * @param fileExt String
	 * @return String
	 */
	public final String getProject_SameNameFile(String ext, String fileExt) {
		if (ext == null) return getProject_SameNameFile(fileExt);
		return getProject_Name() + "_" + ext + "." + fileExt;
	}

	/**
	 * 得到此项目相关不同文件 {head}_des-wkope-task-p001_{ext}.{fileExt}<br>
	 * 得到此项目相关不同文件 des-wkope-task-p001_{ext}.{fileExt}<br>
	 * 得到此项目相关不同文件 des-wkope-task-p001.{fileExt}<br>
	 * 得到此项目相关不同文件 des-wkope-task-p001<br>
	 * @param head String
	 * @param ext String
	 * @param fileExt String
	 * @return String
	 */
	public final String getProject_SameNameCommonFile(String head, String ext, String fileExt) {
		String headstr = UtilsString.isSpace(head) ? "" : head.trim() + "_";
		String extstr = UtilsString.isSpace(ext) ? "" : "_" + ext.trim();
		String fileExtstr = UtilsString.isSpace(fileExt) ? "" : "." + fileExt.trim();
		return headstr + getProject_Name() + extstr + fileExtstr;
	}

	/**
	 * 父抽像类初始化
	 */
	void initialization(Composite parent, int style) {
		if (parent == null) return;
		parentComposite = parent;
		parentDisplay = parentComposite.getDisplay();
		parentShell = parentComposite.getShell();
		parentComposite.setSize(ACC_CpsWidth, ACC_CpsHeight);

	}

	/**
	 * 设置项目的扩展对象
	 * @param baseTaskTOC TaskObjectClass
	 */
	public final void setBaseTaskTOC(TaskObjectClass baseTaskTOC) {
		this.baseTaskTOC = baseTaskTOC;
	}

	/** 容器高度 */
	public static final int ACC_CpsHeight = 550;

	/** 容器宽度 */
	public static final int ACC_CpsWidth = 900;

	/**
	 * 项目文件头部如：<br>
	 * {des-wkope-task-}XXXX.accdb<br>
	 * {des-wkope-task-}XXXX.properties<br>
	 * {des-wkope-task-}XXXX.xlsx<br>
	 */
	public static final String ACC_PROHead = "des-wkope-task-";

	/** 日志 */
	static Logger logger = LoggerFactory.getLogger(AbstractTask1_Basic.class);

}
